home *** CD-ROM | disk | FTP | other *** search
- ' Msg# 114699 To: ATARI @ALLE From: DJ5JQ Date: 08Mar91/1847
- ' Subject: YAGI.GFA
- ' Bulletin ID: 083103DB0IZ
- ' Path: DB0CZ!OE9XPI!HB9EAS!DB0GE!DB0LJ!DB0IZ
- ' de DJ5JQ @ DB0IZ
- '
- ' Hallo OM's
- '
- ' Das folgende Programm zum Yagi-Design nach DL6WU wurde kürzlich
- ' von ON4ASX in der Rubrik Atari verbreitet. Ich habe das Programm
- ' ein wenig angepasst, sodaß es nun unter GFA-Basic lauffähig ist.
- ' Um den sicherlich einzigartigen Programmierstil zu erhalten,
- ' habe ich nur das unbedingt nötige am Programm verändert.
- ' Zum Test habe ich eine Antenne fuer das 23cm-Band berechnet. Die
- ' Ergebnisse stimmen recht genau mit einem bestehenden und
- ' funktionierenden Design überein.
- '
- ' 73 Ecki, DJ5JQ @ DB0IZ
- '
- maxels=100
- DIM s(maxels),d(maxels),dh(maxels),dl(maxels),t(maxels)
- ' ********* TITLE *********
- begin:
- CLS
- revideo(1)
- printat(1,23," DL6WU YAGI ANTENNA DESIGN ",0)
- revideo(0)
- printat(2,24,"Original by KY4Z and W6NBI",0)
- printat(3,25,"Ported to the ST by G6ATW",0)
- ' ********* SIGN **********
- mycall:
- printat(8,24,"Please Enter Your Sign",0)
- LOCATE 34,12
- INPUT "",sign$
- sign$=UPPER$(sign$)
- IF LEN(sign$)>10
- GOTO mycall
- ENDIF
- ' ********* FREQUENCY **********
- clearit
- printat(8,24,"Enter Design Frequency [MHz]",0)
- LOCATE 34,12
- INPUT "",freq$
- f=VAL(freq$)
- cm=29979.3/f
- inch=11802.9/f
- ' ********* DIMENSIONS **********
- clearit
- printat(8,20,"Physical Dimensions Can Be Entered In",0)
- printat(10,29,"[ 1 ] Feet",0)
- printat(11,29,"[ 2 ] Metres",0)
- printat(12,29,"[ 3 ] Wavelengths",0)
- printat(14,29,"Select 1, 2 or 3",0)
- CLR u$
- DO
- p$=INKEY$
- SELECT p$
- CASE "1"
- u$="Feet"
- CASE "2"
- u$="Metres"
- CASE "3"
- u$="Wavelengths"
- ENDSELECT
- EXIT IF u$<>""
- LOOP
- ' ********** GAIN or BOOM LENGTH ***********
- l320:
- clearit
- printat(8,32,"You Can Either",0)
- printat(10,20,"[ 1 ] Specify forward gain in dBd and",0)
- printat(11,20," accept estimated boom length, or",0)
- printat(12,20,"[ 2 ] Specify boom length and accept",0)
- printat(13,20," estimated gain",0)
- printat(15,32,"Select 1 or 2",0)
- DO
- kb$=INKEY$
- LOOP UNTIL kb$="1" OR kb$="2"
- IF kb$="2"
- GOTO l530
- ENDIF
- ' ********** GAIN *********
- l390:
- g=0
- prat=0
- WHILE (g<11.8 OR g>21.6)
- prat=prat+1
- IF prat>3 THEN
- dickhead
- ENDIF
- clearit
- printat(8,24,"Forward Gain Must Be Between",0)
- printat(9,24," 11.8 dBd and 21.6 dBd",0)
- printat(11,24," Enter Required Gain [dBd]",0)
- LOCATE 36,13
- INPUT "",gain$
- g=VAL(gain$)
- WEND
- bl=EXP((g-9.2)/3.39)
- b1=bl*inch/12
- b2=bl*cm/100
- clearit
- printat(8,24,"Estimated Overall Boom Length",0)
- LOCATE 34,10
- PRINT USING "###.##",b1;
- PRINT " Feet";
- printat(12,20,"[ ",0)
- PRINT USING "###.##",b2;
- PRINT " Metres";
- PRINT USING "###.##",bl;
- PRINT " Wavelengths ]";
- printat(15,24,"Is This Boom Length Ok ? Y/N",0)
- DO
- kb$=UPPER$(INKEY$)
- LOOP UNTIL kb$="Y" OR kb$="N"
- IF kb$="Y" THEN
- GOTO l660
- ELSE
- GOTO l320
- ENDIF
- l530:
- ' ********* BOOM LENGTH **********
- bl=0
- prat=0
- WHILE (bl<2.2 OR bl>39)
- prat=prat+1
- IF prat>3
- dickhead
- ENDIF
- clearit
- printat(8,20,"Overall Boom Length Must Be Between",0)
- printat(9,28,"2.2 and 39 Wavelengths",0)
- b1=2.2*cm/100
- b2=39*cm/100
- b3=2.2*inch/12
- b4=39*inch/12
- printat(11,25,"[ ",0)
- PRINT USING "###.##",b1;
- PRINT " to ";
- PRINT using;"###.##",b2;
- PRINT " Metres ]";
- printat(12,25,"[ ",0)
- PRINT USING "###.##",b3;
- PRINT " to ";
- PRINT USING "###.##",b4;
- PRINT " Feet ]";
- printat(14,25,"Enter Boom Length in ",0)
- PRINT u$;
- LOCATE 36,16
- INPUT "",boom$
- bl=VAL(boom$)
- IF p$="1"
- bl=bl*12/inch
- ENDIF
- IF p$="2"
- bl=bl*100/cm
- ENDIF
- WEND
- g=9.2+3.39*LOG(bl)
- printat(18,20,"Estimated Maximum Gain is",0)
- PRINT USING "###.##",g;
- PRINT " dBd";
- printat(20,26,"Is This Gain Ok ? Y/N",0)
- DO
- kb$=UPPER$(INKEY$)
- LOOP UNTIL kb$="Y" OR kb$="N"
- IF kb$="N"
- GOTO l320
- ENDIF
- ' ********* BOOM MATERIAL AND ELEMENT MOUNTING ************
- l660:
- clearit
- printat(8,18,"Select Boom Material and Element Mounting",0)
- printat(10,18,"[ 1 ] Metal boom, elements pass through",0)
- printat(11,18," and are NOT INSULATED",0)
- printat(12,18,"[ 2 ] Metal boom, elements pass through",0)
- printat(13,18," but are INSULATED",0)
- printat(14,18,"[ 3 ] Non-metallic boom, or elements are",0)
- printat(15,18," mounted on insulators",0)
- printat(17,18,"WARNING: option 3 implies NO CORRECTION",0)
- printat(18,18," for influence of metal boom !",0)
- printat(19,18," If in doubt, choose 1 or 2",0)
- printat(21,27,"Select 1, 2 or 3",0)
- DO
- e$=INKEY$
- LOOP UNTIL e$="1" OR e$="2" OR e$="3"
- IF e$="3" THEN
- bc1=0
- bd=0
- GOTO l1070
- ENDIF
- l780:
- bd=-1
- WHILE (bd<0 OR bd>0.06)
- clearit
- printat(8,24,"Enter Boom Diameter or Width",0)
- printat(9,24,"of Square Section in ",0)
- IF p$="1"
- PRINT "Inches";
- ENDIF
- IF p$="2"
- PRINT "Centimetres";
- ENDIF
- d1=0.06*cm
- d2=0.06*inch
- printat(11,18,"[ Maximum ",0)
- PRINT USING "##.##",d1;
- PRINT " Centimetres";
- PRINT USING "##.##",d2;
- PRINT " Inches ]";
- LOCATE 36,13
- INPUT "",boomd$
- bd=VAL(boomd$)
- IF p$="1"
- bd=bd/inch
- ENDIF
- IF p$="2"
- bd=bd/cm
- ENDIF
- WEND
- bc1=733*bd*(0.055-bd)-504*bd*(0.03-bd)
- clearit
- printat(8,18,"Your choice of boom material and element",0)
- printat(9,18,"mounting method requires a correction to",0)
- printat(10,18,"all the element lengths. If the elements",0)
- printat(11,18,"pass diametrically through the boom, and",0)
- printat(12,18,"are bonded to it, the boom correction",0)
- printat(13,18,"would be ",0)
- PRINT USING "#.####",bc1;
- PRINT " of the boom diameter.";
- IF e$="1" THEN
- GOTO l950
- ELSE
- bc1=bc1/2
- ENDIF
- printat(14,18,"Since you have chosen insulated elements",0)
- printat(15,18,"the boom correction is one-half that, ie",0)
- LOCATE 18,16
- PRINT USING "#.####",bc1;
- PRINT " of the boom diameter.";
- l950:
- printat(18,20,"Is This Boom Correction Ok ? Y/N",0)
- DO
- kb$=UPPER$(INKEY$)
- LOOP UNTIL kb$="Y" OR kb$="N"
- IF kb$="Y"
- GOTO l1070
- ENDIF
- clearit
- printat(8,20," Hmmm .... in that case you can",0)
- printat(10,20,"[ 1 ] Enter your own boom correction",0)
- printat(11,20,"[ 2 ] Select a different element",0)
- printat(12,20," mounting method",0)
- printat(13,20,"[ 3 ] Accept my boom correction",0)
- printat(14,20," after all",0)
- printat(15,20," Select 1, 2 or 3",0)
- DO
- kb$=UPPER$(INKEY$)
- LOOP UNTIL kb$="1" OR kb$="2" OR kb$="3"
- IF kb$="2"
- GOTO l660
- ENDIF
- IF kb$="3"
- GOTO l1070
- ENDIF
- bc1=-1
- WHILE (bc1<0 OR bc1>1)
- clearit
- printat(8,20,"Enter your correction as a fraction",0)
- printat(9,20,"of boom diameter between 0 and 1",0)
- LOCATE 36,11
- INPUT bcor$
- bc1=VAL(bcor$)
- WEND
- bc=bc1*bd
- ' ********* ELEMENT DIAMETERS *************
- l1070:
- dd=-1
- ed=-1
- WHILE (dd<0.001 OR dd>0.02 OR ed<0.001 OR ed>0.02)
- clearit
- printat(8,22,"Element Diameter Must Be Between",0)
- printat(9,22," 0.001 and 0.02 Wavelengths",0)
- d1=0.001*cm
- d2=0.02*cm
- d3=0.001*inch
- d4=0.02*inch
- printat(11,23,"[ ",0)
- PRINT USING "##.##",d1;
- PRINT " to ";
- PRINT USING "##.##",d2;
- PRINT " Centimetres ]";
- printat(12,23,"[ ",0)
- PRINT USING "##.##",d3;
- PRINT " to ";
- PRINT USING "##.##",d4;
- PRINT " Inches ]";
- printat(14,24,"Enter Driven Element Diameter",0)
- LOCATE 32,15
- PRINT "in ";
- IF p$="1" THEN
- PRINT "Inches";
- ELSE
- PRINT "Centimetres";
- ENDIF
- LOCATE 35,17
- INPUT dd$
- dd=VAL(dd$)
- printat(19,22,"Enter Parasitic Element Diameter",0)
- LOCATE 32,20
- PRINT "in ";
- IF p$="1"
- PRINT "Inches";
- ELSE
- PRINT "Centimetres";
- ENDIF
- LOCATE 35,22
- INPUT ed$
- ed=VAL(ed$)
- IF p$="1"
- dd=dd/inch
- ed=ed/inch
- ENDIF
- IF p$="2"
- dd=dd/cm
- ed=ed/cm
- ENDIF
- WEND
- ' ********** MATHS ***********
- l1180:
- m=0
- sy=1
- sr=0.216144
- l1200:
- la=bl-sr
- FOR n=1 TO 14
- s(n)=0.081444+0.12178*LOG(n)
- IF n=1
- t(n)=sr+s(n)
- ELSE
- t(n)=t(n-1)+s(n)
- ENDIF
- la=la-s(n)
- IF la<0 THEN
- m=n-1
- n=14
- sy=la
- la=la+s(n)
- ENDIF
- NEXT n
- IF sy<0
- GOTO l1330
- ENDIF
- FOR n=15 TO maxels
- s(n)=s(14)
- t(n)=t(n-1)+s(n)
- la=la-s(n)
- IF la<0
- m=n-1
- la=la+s(n)
- n=maxels
- ENDIF
- NEXT n
- l1330:
- ll=bl-la
- g1=9.2+3.39*LOG(ll)
- IF g1<11.8
- bl=1.05*bl
- ELSE
- GOTO l1380
- ENDIF
- GOTO l1200
- l1380:
- RESTORE
- CLR exit!
- FOR q=1 TO 7
- READ k,k1,k2,k3,k4
- IF k=ed
- j=0
- exit!=TRUE
- ENDIF
- EXIT IF exit
- IF k<ed
- l=k
- ELSE
- GOTO l1430
- ENDIF
- kl1=k1
- kl2=k2
- kl3=k3
- kl4=k4
- l1430:
- IF k>ed
- h=k
- ELSE
- GOTO l1460
- ENDIF
- kh1=k1
- kh2=k2
- kh3=k3
- kh4=k4
- EXIT IF TRUE
- ' GOTO l1470
- l1460:
- NEXT q
- IF NOT exit!
- l1470:
- j=(ed-l)/(h-l)
- ENDIF
- l1480:
- r=0.476945+bc
- de=(0.4777-(1.0522*dd)+(0.43363*(dd^-0.014891)))/2
- FOR n=1 TO m
- IF j=0
- d(n)=(k1-k2*LOG(n))*(1-k3*EXP(-k4*n))
- ELSE
- l2040
- ENDIF
- d(n)=d(n)+bc
- NEXT n
- ' ********* SCREEN DISPLAY ***********
- l2500:
- CLS
- IF LEN(sign$)
- printat(1,20," DL6WU YAGI DESIGN FOR ",0)
- PRINT sign$;
- ELSE
- printat(1,20,"---- DL6WU YAGI DESIGN DETAILS ----",0)
- ENDIF
- printat(3,20,"Design Frequency : ",0)
- PRINT freq$;" MHz";
- printat(4,20,"Number of Elements : ",0)
- PRINT m+2;
- printat(5,20,"Boom Diameter : ",0)
- xx=@units(bd)
- PRINT USING "###.###",xx;
- @printunits
- printat(6,20,"Element Diameters",0)
- printat(7,20," Driven : ",0)
- xx=@units(dd)
- PRINT USING "###.###",xx;
- @printunits
- printat(8,20," Parasitic : ",0)
- xx=@units(ed)
- PRINT USING "###.###",xx;
- @printunits
- printat(9,20,"Electrical Boom Length: ",0)
- xx=@units(ll)
- PRINT USING "###.###",xx;
- @printunits
- printat(10,20,"Estimated Performance",0)
- printat(11,20," Gain : ",0)
- PRINT USING "###.###",g1;
- PRINT " dBd";
- bh=30-3.14*(g1-14)
- printat(12,20," E-Beamwidth : ",0)
- PRINT USING "###.###",bh;
- PRINT " deg";
- bv=bh/COS(bh/(2*57))
- printat(13,20," H-Beamwidth : ",0)
- PRINT USING "###.###",bv;
- PRINT " deg";
- printat(14,20,"Stacking Distances",0)
- printat(15,20," Horizontal : ",0)
- sh=51/bh
- sv=51/bv
- xx=@units(sh)
- PRINT USING "###.###",xx;
- @printunits
- printat(16,20," Vertical : ",0)
- xx=@units(sv)
- PRINT USING "###.###",xx;
- @printunits
- LOCATE 1,18
- PRINT TAB(10);"NOTES:"
- IF LEN(bcor$)
- PRINT TAB(10);"You have chosen your own element mounting method"
- PRINT TAB(10);"or boom correction"
- GOTO l2770
- ENDIF
- SELECT e$
- CASE "1"
- PRINT TAB(10);"Elements are SECURELY connected to the metal boom"
- CASE "2"
- PRINT TAB(10);"Elements are INSULATED through the metal boom"
- CASE "3"
- PRINT TAB(10);"Elements are INSULATED or the boom is NON-CONDUCTIVE"
- ENDSELECT
- l2770:
- IF e$<>"3"
- PRINT TAB(10);"A boom correction of ";
- PRINT USING "#.####",bc1;
- PRINT " the boom diameter has been applied"
- ENDIF
- PRINT TAB(10);"Tolerance required for element lengths is +/- ";
- xx=@units(0.003)
- PRINT USING "#.####",xx;
- @printunits
- PRINT
- PRINT
- PRINT TAB(20);"Hard Copy of Detailed Antenna Design? Y/N"
- DO
- kb$=UPPER$(INKEY$)
- LOOP UNTIL kb$="Y" OR kb$="N"
- IF kb$="Y"
- GOTO hardcopy
- ENDIF
- again:
- PRINT
- PRINT TAB(35);"Run Again? Y/N";
- DO
- kb$=UPPER$(INKEY$)
- LOOP UNTIL kb$="Y" OR kb$="N"
- IF kb$="Y" THEN
- GOTO begin
- ELSE
- SYSTEM
- ENDIF
- ' ********** PRINTER OUTPUT ************
- hardcopy:
- IF LEN(sign$)
- LPRINT TAB(10);"DL6WU YAGI DESIGN FOR ";sign$
- LPRINT TAB(10);
- FOR i=1 TO LEN(sign$)
- LPRINT "=";
- NEXT i
- LPRINT "======================"
- ELSE
- LPRINT TAB(10);" DL6WU YAGI DESIGN DETAILS"
- LPRINT TAB(10);"=================================="
- ENDIF
- LPRINT
- LPRINT TAB(10);"Original program by KY4Z and W6NBI"
- LPRINT TAB(10);"Ported to the Atari ST by G6ATW"
- LPRINT TAB(10);" ST Version 1.0"
- LPRINT
- LPRINT
- LPRINT TAB(10);"Design Frequency : ";freq$;" MHz"
- LPRINT TAB(10);"Number of Elements : ";m+2
- LPRINT TAB(10);"Boom Diameter : ";
- xx=@units(bd)
- LPRINT USING "###.###",xx;
- @lprintunits
- LPRINT TAB(10);"Element Diameters";
- LPRINT TAB(10);" Driven : ";
- xx=@units(dd)
- LPRINT USING "###.###",xx;
- @lprintunits
- LPRINT TAB(10);" Parasitic : ";
- xx=@units(ed)
- LPRINT USING "###.###",xx;
- @lprintunits
- LPRINT TAB(10);"Electrical Boom Length: ";
- xx=@units(ll)
- LPRINT USING "###.###",xx;
- @lprintunits
- LPRINT
- LPRINT TAB(10);"Estimated Performance"
- LPRINT TAB(10);" Gain : ";
- LPRINT USING "###.###",g1;
- LPRINT " dBd"
- bh=30-3.14*(g1-14)
- LPRINT TAB(10);" E-Beamwidth : ";
- LPRINT USING "###.###",bh;
- LPRINT " deg"
- bv=bh/COS(bh/(2*57))
- LPRINT TAB(10);" H-Beamwidth : ";
- LPRINT USING "###.###",bv;
- LPRINT " deg"
- LPRINT
- LPRINT TAB(10);"Stacking Distances"
- LPRINT TAB(10);" Horizontal : ";
- sh=51/bh
- sv=51/bv
- xx=@units(sh)
- LPRINT USING "###.###",xx;
- @lprintunits
- LPRINT TAB(10);" Vertical : ";
- xx=@units(sv)
- LPRINT USING "###.###",xx;
- @lprintunits
- LPRINT TAB(10);"NOTES:"
- IF LEN(bcor$)
- LPRINT TAB(10);"You have chosen your own element mounting method"
- LPRINT TAB(10);"or boom correction"
- GOTO p2770
- ENDIF
- SELECT e$
- CASE "1"
- LPRINT TAB(10);"Elements are SECURELY connected to the metal boom"
- CASE "2"
- LPRINT TAB(10);"Elements are INSULATED through the metal boom"
- CASE "3"
- LPRINT TAB(10);"Elements are INSULATED or the boom is NON-CONDUCTIVE"
- ENDSELECT
- p2770:
- IF e$<>"3"
- LPRINT TAB(10);"A boom correction of ";
- LPRINT USING "#.####",bc1;
- LPRINT " the boom diameter has been applied"
- ENDIF
- LPRINT TAB(10);"Tolerance required for element lengths is +/- ";
- xx=@units(0.003)
- LPRINT USING "#.####",xx;
- @lprintunits
- LPRINT CHR$(12)
- LPRINT TAB(6);"CUMULATIVE";TAB(58);"ELEMENT"
- LPRINT TAB(6);"SPACING";TAB(58);"LENGTH"
- LPRINT TAB(6);"----------";TAB(58);"-------"
- LPRINT TAB(4);"Cms";TAB(15);"Inches";TAB(56);"Cms";TAB(64);"Inches"
- LPRINT
- LPRINT TAB(4);"0";TAB(15);"0";
- LPRINT TAB(23);"REFL ----------#---------- ";
- xx=r*cm
- LPRINT USING "####.##",xx;
- LPRINT TAB(63);
- xx=r*inch
- LPRINT USING "####.##",xx;
- LPRINT TAB(38);"#"
- LPRINT TAB(2);
- xx=sr*cm
- LPRINT USING "####.##",xx;
- LPRINT TAB(13);
- xx=sr*inch
- LPRINT USING "####.##",xx;
- LPRINT TAB(23);"DR EL =========#========= ";
- xx=de*cm
- LPRINT USING "####.##",xx;
- LPRINT TAB(63);
- xx=de*inch
- LPRINT USING "####.##",xx
- FOR n=1 TO m
- LPRINT TAB(38);"#"
- LPRINT TAB(2);
- xx=t(n)*cm
- LPRINT USING "####.##",xx;
- LPRINT TAB(13);
- xx=t(n)*inch
- LPRINT USING "####.##",xx;
- LPRINT TAB(23);"D";STR$(n);
- IF n<10
- LPRINT " ";
- ENDIF
- LPRINT " --------#-------- ";
- xx=d(n)*cm
- LPRINT USING "####.##",xx;
- LPRINT TAB(63);
- xx=d(n)*inch
- LPRINT USING "####.##",xx
- NEXT n
- GOTO again
- SYSTEM
- > PROCEDURE l2040
- dl(n)=(kl1-kl2*LOG(n))*(1-kl3*EXP(-kl4*n))
- dh(n)=(kh1-kh2*LOG(n))*(1-kh3*EXP(-kh4*n))
- d(n)=dl(n)+j*(dh(n)-dl(n))
- RETURN
- DATA .001, .4711, .018, .08398, .965
- DATA .003, .462, .01941, .08543, .9697
- DATA .005, .4538, .02117, .0951, 1.007
- DATA .007, .4491, .02274, .08801, .9004
- DATA .01, .4421, .02396, .1027, 1.038
- DATA .015, .4358,.02558, .1149, 1.034
- DATA .02, .4268, .02614, .1112, 1.036
- > FUNCTION units(wl)
- ' shared p$, inch, cm
- IF p$="1"
- units=wl*inch
- ENDIF
- IF p$="2"
- units=wl*cm
- ENDIF
- RETURN units
- ENDFUNC
- > PROCEDURE printunits
- ' shared p$
- IF p$="1"
- PRINT " Inches";
- ENDIF
- IF p$="2"
- PRINT " Centimetres";
- ENDIF
- IF p$="3"
- PRINT " Wavelengths";
- ENDIF
- RETURN
- > PROCEDURE lprintunits
- ' shared p$
- IF p$="1"
- LPRINT " Inches"
- ENDIF
- IF p$="2"
- LPRINT " Centimetres"
- ENDIF
- IF p$="3"
- LPRINT " Wavelengths"
- ENDIF
- RETURN
- PROCEDURE printat(row,col,s$,curs)
- LOCATE col,row
- PRINT s$;
- RETURN
- > PROCEDURE revideo(rev)
- LOCAL junk
- IF rev
- junk=BIOS(3,2,27)
- junk=BIOS(3,2,ASC("p"))
- ELSE
- junk=BIOS(3,2,27)
- junk=BIOS(3,2,ASC("q"))
- ENDIF
- RETURN
- PROCEDURE clearit
- LOCAL junk
- LOCATE 6,1
- junk=BIOS(3,2,27)
- junk=BIOS(3,2,ASC("J"))
- RETURN
- > PROCEDURE dickhead
- RETURN
-
-